package view;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GameView extends JFrame implements KeyListener, ActionListener {

    //创建功能的条目界面
    JMenuItem againGame = new JMenuItem("重新游戏");
    JMenuItem againDl = new JMenuItem("重新登录");
    JMenuItem close = new JMenuItem("关闭游戏");
    //创建关于我们的条目界面
    JMenuItem gzh = new JMenuItem("公众号");
    //创建更换图片的菜单栏
    JMenuItem mv = new JMenuItem("美女");
    JMenuItem animal = new JMenuItem("动物");
    JMenuItem yd = new JMenuItem("运动");
    //定义一个变量用来记录步数
    int step = 0;
    //创建一个二维数组
    private int[][] data = new int[4][4];
    //创建一个正确的二维数组
    private int[][] win =  new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};

    //图片路径
    String path = "img\\image\\animal\\animal3\\";

    public GameView(){
        //初始化界面
       this.setJM();
        //设置菜单
        this.setCD();
        //打乱图片
        this.DLphoto();
        //初始化图片
        this.setPhoto();
        //显示界面
        this.setVisible(true);

        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);


    }
    //记录空白方块的位置
    int x;
    int y;

    //打乱图片的顺序
    private void DLphoto(){
        //创建一个变量用来记录图片路径
        int[] nums = new int[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        //打乱数组
        for (int i = 0; i < nums.length; i++) {
            //随机索引
            Random random = new Random();
            int num = random.nextInt(nums.length);
            int temp = nums[i];
            nums[i] = nums[num];
            nums[num] = temp;
        }

        //添加数据
        for (int i = 0; i < nums.length; i++) {
            data[i / 4][i % 4] = nums[i];
            if(nums[i] == 0){
                //空白方块的位置
               x = i / 4;
               y = i % 4;
            }
        }
    }

    //生成背景图片
    private void backgroundimg(){
        ImageIcon bj = new ImageIcon("img\\image\\background.png");
        JLabel background = new JLabel(bj);
        background.setBounds(40,40,508,560);
        this.getContentPane().add(background);
    }


    //生成图片
    private void setPhoto(){
        //删除所有图片
        this.getContentPane().removeAll();
        //判断顺序是否一致
        if(ok()){
            JLabel jLabel = new JLabel(new ImageIcon("D:\\Java\\allProject_week_17\\img\\image\\win.png"));
            jLabel.setBounds(203,280,197,73);
            this.getContentPane().add(jLabel);
        }
        //加一个步数的操作
        Label step_jLabel = new Label("step : " + step);
        step_jLabel.setBounds(50,30,100,20);
        this.getContentPane().add(step_jLabel);

        //创建一个图片对象
        //第一步，行数,一共有四行
        for (int i = 0; i < 4; i++) {
            //每一行有四张图片
            for (int j = 0; j < 4; j++) {
                JLabel jlabel = new JLabel(new ImageIcon(path + data[i][j] + ".jpg"));
                jlabel.setBounds(105 * j + 83,105 * i + 134,105,105);
                jlabel.setBorder(new BevelBorder(1));
                this.getContentPane().add(jlabel);
            }
        }

        //添加背景图片
        backgroundimg();


        //刷新界面
        this.getContentPane().repaint();
    }

    //初始化界面
    private void setJM(){
        //创建一个游戏主界面
        //大小
        this.setSize(603,680);
        //标题
        this.setTitle("拼图单机版v1.0");
        //置顶的
        this.setAlwaysOnTop(true);
        //居中的
        this.setLocationRelativeTo(null);
        //关闭界面
        this.setDefaultCloseOperation(3);
        //将布局设置成null
        this.setLayout(null);
        //给整个界面添加一个键盘监视器
        this.addKeyListener(this);
    }

    //菜单的设置
    private void setCD(){
        //创建一个菜单栏
        JMenuBar jMenuBar = new JMenuBar();
        //创建两个功能
        JMenu function = new JMenu("功能");
        JMenu about = new JMenu("关于我们");
        //换图片
        JMenu exchange = new JMenu("更换图片");
        jMenuBar.add(exchange);
        exchange.add(animal);
        exchange.add(mv);
        exchange.add(yd);

        //组合在一起
        about.add(gzh);

        function.add(exchange);
        function.add(againGame);
        function.add(againDl);
        function.add(close);

        jMenuBar.add(function);
        jMenuBar.add(about);

        this.setJMenuBar(jMenuBar);
        //给菜单栏准备绑定事件
        againGame.addActionListener(this);
        againDl.addActionListener(this);
        close.addActionListener(this);
        gzh.addActionListener(this);
        mv.addActionListener(this);
        animal.addActionListener(this);
        yd.addActionListener(this);

    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    //按下按键的操作
    @Override
    public void keyPressed(KeyEvent e) {
        //按住a的时候就会显示出整张图片，松开就会还原
        if(e.getKeyCode() == 65){
            //删除本届面中所有图片
            this.getContentPane().removeAll();
            //重新加载整张图片
            JLabel jLabel = new JLabel(new ImageIcon(path + "all.jpg"));
            jLabel.setBounds(83,134,420,420);
            this.getContentPane().add(jLabel);
            //重新加载背景图
            backgroundimg();

            //刷新界面
            this.getContentPane().repaint();

        }
    }


    //松开按键的操作
    @Override
    public void keyReleased(KeyEvent e) {

        //判断是否成功，如果成功，那么按键就不用操作了
        if(ok()){
            return;
        }
        System.out.println(e.getKeyCode());
        //获取上下左右
        /*
        上：38，下：40，右：39，左：37
         */
        if(e.getKeyCode() == 37){
            //统计步数
            step++;
            System.out.println("向左移动");
            if(y == 3){
                return;
            }
            data[x][y] = data[x][y+1];
            data[x][y+1] = 0;
            y++;
            setPhoto();

        }
        if(e.getKeyCode() == 38){
            //统计步数
            step++;
            System.out.println("向上移动");
            //做出角标越界的判断
            if(x == 3){
                return;
            }
            //将白块的数据跟下面的方块交换
            //x，y表示空白方块的坐标
            //那么空白方块下面的就是 x+1,y
            data[x][y] = data[x+1][y];
            data[x+1][y] = 0;
            x++;

            //重新获取图片
            setPhoto();


        }if(e.getKeyCode() == 39){
            //统计步数
            step++;
            System.out.println("向右移动");
            if(y == 0){
                return;
            }
            data[x][y] = data[x][y-1];
            data[x][y-1] = 0;
            y--;
            setPhoto();
        }
        if(e.getKeyCode() == 40){
            //统计步数
            step++;
            System.out.println("向下移动");
            if(x == 0){
                return;
            }
            data[x][y] = data[x-1][y];
            data[x-1][y] = 0;
            x--;
            setPhoto();
        }
        //查看完整图片之后应该还是乱序状态
        if(e.getKeyCode() == 65){
            setPhoto();
        }

        //w一键通关
        if(e.getKeyCode() == 87){
            data = new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};

            setPhoto();
        }
    }

    //对拼图进行一个判断
    private boolean ok(){
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++) {
                if(data[i][j] != win[i][j]){
                    return false;
                }
            }
        }
        return true;
        
    }

    //重新开始
    @Override
    public void actionPerformed(ActionEvent e) {
        //获取当前的菜单对象
        Object source = e.getSource();
        //重新游戏
        if(source == againGame){
            step = 0;
            DLphoto();
            setPhoto();
            this.getContentPane().repaint();
        }
        //重新登录
        if(source == againDl){
            System.out.println("重新登录");
            //关闭当前游戏界面
            this.setVisible(false);
        }
        if(source == close){
            this.dispose();
        }
        if(source == gzh){
            System.out.println("公众号");
            //创建一个弹框对象
            JDialog jDialog = new JDialog();

            JLabel jLabel = new JLabel(new ImageIcon("img\\about.png"));
            jLabel.setBounds(0,0,340,457);
            jDialog.getContentPane().add(jLabel);

            //设置弹框大小
            jDialog.setSize(334,334);
            //设置弹框置顶
            jDialog.setAlwaysOnTop(true);
            //弹框据中
            jDialog.setLocationRelativeTo(null);
            //弹框不关闭无法操作其他项目
            jDialog.setModal(true);
            //显示弹框
            jDialog.setVisible(true);
        }

        //美女监视器
        if(source == mv){
            //随机一张图片
            Random random = new Random();
            int num = random.nextInt(14) + 1;
            path = "img\\image\\girl\\girl" + num + "\\";

            //打乱顺序
            DLphoto();
            //添加图片
            setPhoto();
        }

        //动物监视器
        if(source == animal){
            //随机一张图片
            Random random = new Random();
            int num = random.nextInt(9) + 1;
            path = "img\\image\\animal\\animal" + num + "\\";

            //打乱顺序
            DLphoto();
            //添加图片
            setPhoto();
        }
        //运动监视器
        if(source == yd){
            //随机一张图片
            Random random = new Random();
            int num = random.nextInt(11) + 1;
            path = "img\\image\\sport\\sport" + num + "\\";

            //打乱顺序
            DLphoto();
            //添加图片
            setPhoto();
        }

    }
}
